package xin.javashare.designPattern.creation.singleton;

/**
 * 延迟加载，“懒汉模式”
 */
public class LazySingleton {
    // 持有私有静态实例，防止被引用，此处赋值为null,目的是实现延迟加载
    private static LazySingleton instance = null;
    // 私有构造方法，防止被实例化
    private LazySingleton(){}
    // 静态方法创建实例
    public static LazySingleton getIntstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }

    // 对方法加synchronized关键字，锁住的是整个对象，性能下降
    public static synchronized LazySingleton getIntstance2() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }

    // 将synchronized关键字加在内部，
    // 调用的时候不需要加锁的，只有在instance为null，并创建对象的时候才需要加锁，性能有一定的提升
    public static  LazySingleton getIntstance3() {
        // DCL双检查锁机制，而如果只使用一次判断，可能出现非线程安全的问题
        if (instance ==null) {
            synchronized (instance) {
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }



    // 如果对象被用于实例化，可以保证对象在序列化前后保持一致

    public Object readResolve() {
        return instance;
    }
}
